#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import anthropic
import os
from datetime import datetime
import time


class ClaudeAPITroubleshooter:
    def __init__(self, api_key: str = None):
        self.api_key = api_key or os.getenv('ANTHROPIC_API_KEY')

    def check_api_key(self):
        """检查API密钥格式和有效性"""
        print("=== API密钥检查 ===")

        if not self.api_key:
            print("❌ 错误: 未找到API密钥")
            print("解决方案:")
            print("1. 设置环境变量: export ANTHROPIC_API_KEY='your-key-here'")
            print("2. 或者直接传入api_key参数")
            return False

        # 检查API密钥格式
        if not self.api_key.startswith('sk-'):
            print("❌ 错误: API密钥格式不正确")
            print("正确格式应该以 'sk-' 开头")
            return False

        # 检查密钥长度
        if len(self.api_key) < 50:
            print("❌ 警告: API密钥长度可能不正确")
            return False

        print(f"✅ API密钥格式正确: {self.api_key[:10]}...")
        return True

    def test_basic_connection(self):
        """测试基本连接"""
        print("\n=== 基本连接测试 ===")

        if not self.check_api_key():
            return False

        try:
            client = anthropic.Anthropic(api_key=self.api_key)

            # 发送一个简单的测试请求
            response = client.messages.create(
                model="claude-3-haiku-20240307",  # 使用最便宜的模型测试
                max_tokens=10,
                messages=[
                    {"role": "user", "content": "Hi"}
                ]
            )

            print("✅ 连接成功!")
            print(f"响应: {response.content[0].text}")
            return True

        except anthropic.AuthenticationError:
            print("❌ 认证错误: API密钥无效")
            print("解决方案:")
            print("1. 检查API密钥是否正确")
            print("2. 确认API密钥没有过期")
            print("3. 访问 https://console.anthropic.com/ 重新生成密钥")
            return False

        except anthropic.PermissionDeniedError:
            print("❌ 权限错误: 账户权限不足")
            print("解决方案:")
            print("1. 检查账户是否有足够的积分")
            print("2. 确认账户状态是否正常")
            print("3. 联系Anthropic客服")
            return False

        except anthropic.RateLimitError:
            print("❌ 速率限制错误")
            print("解决方案:")
            print("1. 等待一段时间后重试")
            print("2. 减少请求频率")
            return False

        except Exception as e:
            print(f"❌ 其他错误: {e}")
            return False

    def test_different_models(self):
        """测试不同模型的可用性"""
        print("\n=== 模型可用性测试 ===")

        models = [
            "claude-3-haiku-20240307",
            "claude-3-sonnet-20240229",
            "claude-3-opus-20240229"
        ]

        client = anthropic.Anthropic(api_key=self.api_key)

        for model in models:
            try:
                print(f"测试模型: {model}")
                response = client.messages.create(
                    model=model,
                    max_tokens=5,
                    messages=[
                        {"role": "user", "content": "Hi"}
                    ]
                )
                print(f"✅ {model} 可用")

            except anthropic.NotFoundError:
                print(f"❌ {model} 不可用或无权限访问")
            except Exception as e:
                print(f"❌ {model} 错误: {e}")

            time.sleep(1)  # 避免速率限制

    def check_account_status(self):
        """检查账户状态信息"""
        print("\n=== 账户状态检查 ===")
        print("请手动检查以下信息:")
        print("1. 访问 https://console.anthropic.com/")
        print("2. 检查账户余额和积分")
        print("3. 确认账户状态是否为活跃状态")
        print("4. 检查是否有使用限制")

    def detailed_error_analysis(self, error_response):
        """详细错误分析"""
        print("\n=== 详细错误分析 ===")

        if isinstance(error_response, dict) and 'error' in error_response:
            error_info = error_response['error']
            error_type = error_info.get('type', 'unknown')
            error_message = error_info.get('message', 'No message')

            print(f"错误类型: {error_type}")
            print(f"错误消息: {error_message}")

            # 根据错误类型提供具体解决方案
            if error_type == 'forbidden':
                print("\n🔧 Forbidden错误解决方案:")
                print("1. 检查API密钥是否正确且有效")
                print("2. 确认账户是否有足够余额")
                print("3. 检查是否违反了使用政策")
                print("4. 确认请求的模型是否在允许范围内")
                print("5. 检查请求频率是否过高")

            elif error_type == 'authentication_error':
                print("\n🔧 认证错误解决方案:")
                print("1. 重新生成API密钥")
                print("2. 检查密钥格式是否正确")

            elif error_type == 'rate_limit_error':
                print("\n🔧 速率限制解决方案:")
                print("1. 减少请求频率")
                print("2. 实现重试机制")
                print("3. 升级账户等级")


def safe_api_call():
    """安全的API调用示例"""
    print("=== 安全API调用示例 ===")

    # 从环境变量获取API密钥
    api_key = os.getenv('ANTHROPIC_API_KEY')

    if not api_key:
        print("请设置ANTHROPIC_API_KEY环境变量")
        return

    try:
        client = anthropic.Anthropic(api_key=api_key)

        # 使用重试机制
        max_retries = 3
        for attempt in range(max_retries):
            try:
                response = client.messages.create(
                    model="claude-3-haiku-20240307",  # 使用最基础的模型
                    max_tokens=100,
                    messages=[
                        {"role": "user", "content": "Hello, please respond briefly."}
                    ]
                )

                print("✅ 调用成功!")
                print(f"响应: {response.content[0].text}")
                break

            except anthropic.RateLimitError:
                if attempt < max_retries - 1:
                    wait_time = 2 ** attempt  # 指数退避
                    print(f"遇到速率限制，等待 {wait_time} 秒后重试...")
                    time.sleep(wait_time)
                else:
                    print("达到最大重试次数")

            except Exception as e:
                print(f"尝试 {attempt + 1} 失败: {e}")
                if attempt == max_retries - 1:
                    print("所有重试都失败了")

    except Exception as e:
        print(f"初始化客户端失败: {e}")


def main():
    print("Claude API 故障排查工具")
    print("=" * 50)

    # 获取API密钥
    api_key = input("请输入你的API密钥 (或按Enter使用环境变量): ").strip()
    if not api_key:
        api_key = os.getenv('ANTHROPIC_API_KEY')

    if not api_key:
        print("❌ 未提供API密钥")
        print("请设置 ANTHROPIC_API_KEY 环境变量或直接输入")
        return

    # 创建故障排查器
    troubleshooter = ClaudeAPITroubleshooter(api_key)

    # 执行检查
    troubleshooter.check_api_key()
    troubleshooter.test_basic_connection()
    # troubleshooter.test_different_models()  # 可选：测试不同模型
    troubleshooter.check_account_status()

    print("\n" + "=" * 50)
    print("故障排查完成！")


if __name__ == "__main__":
    # main()
    #
    # # 运行安全API调用示例
    # print("\n" + "=" * 50)
    # safe_api_call()

    import anthropic

    api_key = input("请输入你的API密钥 (或按Enter使用环境变量): ").strip()
    if not api_key:
        api_key = os.getenv('ANTHROPIC_API_KEY')

    client = anthropic.Anthropic(
        # defaults to os.environ.get("ANTHROPIC_API_KEY")
        api_key=api_key,
    )
    message = client.messages.create(
        model="claude-3-5-sonnet-20240620",
        max_tokens=1024,
        messages=[
            {"role": "user", "content": "Hello, Claude"}
        ]
    )
    print(message.content)